package com.lb.ai.common.response;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.pagehelper.PageInfo;
import com.lb.ai.common.response.code.BaseModule;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Collections;
import java.util.List;

/**
 * 通用分页响应对象
 * 继承Result类，提供统一的分页数据响应格式。支持多种分页框架的结果转换，包括：
 * <pre>
 * 1. MyBatis-Plus ({@link IPage})
 * 2. PageHelper ({@link PageInfo})
 * </pre>
 *
 * <p>使用示例：
 * <pre>{@code
 * // 使用 MyBatis-Plus
 * IPage<User> page = userMapper.selectPage(new Page<>(1, 10), null);
 * PageResponse<User> response = PageResponse.of(page);
 *
 * // 使用 PageHelper
 * PageInfo<User> pageInfo = new PageInfo<>(userList);
 * PageResponse<User> response = PageResponse.of(pageInfo);
 * }</pre>
 *
 * @param <T> 分页数据类型
 * @author LiuB
 * @since 0.0.1
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class PageResult<T> extends Result<List<T>> {
    private static final long serialVersionUID = 1L;

    /**
     * 当前页码
     * <p>页码从1开始，表示当前请求的页号
     */
    private long current;

    /**
     * 每页显示条数
     * <p>表示每页最多显示的记录数量，默认值通常为10
     */
    private long size;

    /**
     * 总记录数
     * <p>表示符合查询条件的总数据量
     */
    private long total;

    /**
     * 总页数
     * <p>根据总记录数(total)和每页显示条数(size)计算得出：
     * <pre>pages = (total + size - 1) / size</pre>
     */
    private long pages;

    /**
     * 创建分页响应对象
     *
     * @param current 当前页码（从1开始）
     * @param size    每页显示条数
     * @param total   总记录数
     * @param records 分页数据列表
     */
    public PageResult(long current, long size, long total, List<T> records) {
        super.setData(records);
        this.current = current;
        this.size = size;
        this.total = total;
        this.pages = size == 0 ? 0 : (total + size - 1) / size;
        super.setSuccess(true);
        super.setCode(BaseModule.Code.SUCCESS.getCode());
    }

    /**
     * 将 MyBatis-Plus 的分页结果转换为分页响应对象
     *
     * @param page MyBatis-Plus的分页结果对象
     * @param <T>  数据类型
     * @return 转换后的分页响应对象
     */
    public static <T> PageResult<T> of(IPage<T> page) {
        return new PageResult<>(page.getCurrent(), page.getSize(), page.getTotal(), page.getRecords());
    }

    /**
     * 将 PageHelper 的分页结果转换为分页响应对象
     *
     * @param page PageHelper的分页结果对象
     * @param <T>  数据类型
     * @return 转换后的分页响应对象
     */
    public static <T> PageResult<T> of(PageInfo<T> page) {
        return new PageResult<>(page.getPageNum(), page.getPageSize(), page.getTotal(), page.getList());
    }

    /**
     * 创建空的分页响应对象
     * <p>用于无数据或异常情况下返回空结果，包含以下默认值：
     * <ul>
     *     <li>当前页码：1</li>
     *     <li>每页条数：10</li>
     *     <li>总记录数：0</li>
     *     <li>数据列表：空列表</li>
     * </ul>
     *
     * @param <T> 数据类型
     * @return 空的分页响应对象
     */
    public static <T> PageResult<T> empty() {
        return new PageResult<>(1, 10, 0, Collections.emptyList());
    }
} 